package com.pokermind.model.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.util.List;
import java.util.Map;

/**
 * 德州扑克AI分析请求 - 完全对应专业提示词的输入字段
 * 
 * @author PokerMind Team
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PokerAIRequest {
    
    // ================== 局面与位置 ==================
    /**
     * 街道: preflop | flop | turn | river
     */
    private String street;
    
    /**
     * 玩家ID - 指定要分析决策的玩家
     */
    @JsonProperty("player_id")
    private String playerId;
    
    /**
     * 当前玩家位置
     */
    @JsonProperty("player_pos")
    private String playerPos;
    
    /**
     * Hero位置 (已废弃，请使用player_pos)
     * @deprecated 使用playerPos替代
     */
    @Deprecated
    @JsonProperty("hero_pos")
    private String heroPos;
    
    /**
     * 按钮位置
     */
    @JsonProperty("button_pos") 
    private Integer buttonPos;
    
    /**
     * 该行动位置
     */
    @JsonProperty("to_act")
    private String toAct;
    
    /**
     * 存活玩家数
     */
    @JsonProperty("players_alive")
    private Integer playersAlive;
    
    /**
     * 行动概要标签 (如 "single-raised pot; heads-up; IP; hero=preflop raiser")
     */
    @JsonProperty("actions_brief")
    private String actionsBrief;
    
    /**
     * 行动历史序列
     */
    @JsonProperty("actions_history")
    private List<ActionHistory> actionsHistory;
    
    // ================== 筹码与底池 ==================
    /**
     * 底池大小(实际金额)
     */
    private Double pot;
    
    /**
     * 筹码深度(实际金额)
     */
    private Double stacks;
    
    /**
     * 大盲金额
     */
    @JsonProperty("big_blind")
    private Double bigBlind;
    
    /**
     * 底池大小(BB) - 兼容字段
     */
    @JsonProperty("pot_bb")
    private Double potBb;
    
    /**
     * 筹码深度(BB) - 兼容字段
     */
    @JsonProperty("stacks_bb")
    private Double stacksBb;
    
    /**
     * 筹码底池比
     */
    private Double spr;
    
    // ================== 牌面与手牌 ==================
    /**
     * 公共牌 (非preflop必有)
     */
    private String board;
    
    /**
     * 当前玩家底牌
     */
    @JsonProperty("hole_cards")
    private List<String> holeCards;
    
    /**
     * Hero底牌 (已废弃，请使用hole_cards)
     * @deprecated 使用holeCards替代
     */
    @Deprecated
    @JsonProperty("hero_hole")
    private String heroHole;
    
    /**
     * 主要对手位置
     */
    @JsonProperty("villain_key_pos")
    private String villainKeyPos;
    
    // ================== 纹理与画像 ==================
    /**
     * 牌面纹理 (A-high rainbow | K-high rainbow | connected two-tone | 等)
     */
    @JsonProperty("board_texture")
    private String boardTexture;
    
    /**
     * 对手画像 (如 "BTN=TAG" 或 {"BTN":"TAG","BB":"loose-passive"})
     */
    @JsonProperty("opponent_profile")
    private Object opponentProfile; // String or Map<String, String>
    
    // ================== 已算指标 ==================
    /**
     * 当前玩家权益 [0,1]
     */
    @JsonProperty("player_equity")
    private Double playerEquity;
    
    /**
     * Hero权益 (已废弃，请使用player_equity)
     * @deprecated 使用playerEquity替代
     */
    @Deprecated
    @JsonProperty("hero_equity")
    private Double heroEquity;
    
    /**
     * 范围优势 [-1,+1]
     */
    @JsonProperty("range_advantage")
    private Double rangeAdvantage;
    
    /**
     * 坚果优势 [-1,+1]
     */
    @JsonProperty("nut_advantage")
    private Double nutAdvantage;
    
    /**
     * 底池赔率说明 (如 "call threshold ≈ 33%")
     */
    @JsonProperty("pot_odds_note")
    private String potOddsNote;
    
    /**
     * 当前玩家是否面临下注（决策场景判断）
     */
    @JsonProperty("facing_bet")
    private Boolean facingBet;
    
    /**
     * 当前玩家需要跟注的金额（仅当facing_bet=true时有效）
     */
    @JsonProperty("amount_to_call")
    private Double amountToCall;
    
    /**
     * 当前玩家是否可以免费过牌（决策场景判断）
     */
    @JsonProperty("can_check")
    private Boolean canCheck;
    
    /**
     * 弃牌权益估计 [0,1]
     */
    @JsonProperty("fold_equity_est")
    private Double foldEquityEst;
    
    /**
     * 摊牌价值 (low|medium|high 或 0-1)
     */
    @JsonProperty("showdown_value")
    private Object showdownValue; // String or Double
    
    /**
     * 阻断牌说明
     */
    @JsonProperty("blocker_note")
    private String blockerNote;
    
    /**
     * 范围说明
     */
    @JsonProperty("range_notes")
    private String rangeNotes;
    
    /**
     * 额外标签 (如 cap_villain_range | range_polarized | thin_value_spot)
     */
    @JsonProperty("extra_tags")
    private List<String> extraTags;
    
    // ================== AI配置参数 ==================
    /**
     * 模型温度参数 [0.0, 1.0]
     */
    private Double temperature;
    
    /**
     * 游戏类型: holdem（德州）、shortdeck（短牌）、omaha（奥马哈）
     * V4.7新增：用于AI理解游戏类型
     */
    @JsonProperty("game_type")
    private String gameType;
    
    /**
     * 返回语言: zh-CN（中文）、en-US（英文）
     * V4.32新增：用于控制AI返回的语言
     * 默认: zh-CN
     */
    @JsonProperty("language")
    private String language;
    
    /**
     * 行动历史项
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ActionHistory {
        /**
         * 位置
         */
        private String position;
        
        /**
         * 行动类型 (open/call/raise/3bet/4bet/check/bet/fold/all-in/probe/donk)
         */
        private String action;
        
        /**
         * 尺寸 (可选)
         */
        private String size;
        
        /**
         * 街道
         */
        private String street;
    }
}
